// 时间换算
export function formatDate(date) {
  let year = date.getFullYear();
  let month = (date.getMonth() + 1).toString().padStart(2, "0"); // 月份是从0开始的
  let day = date.getDate().toString().padStart(2, "0");
  let hours = date.getHours().toString().padStart(2, "0");
  let minutes = date.getMinutes().toString().padStart(2, "0");
  let seconds = date.getSeconds().toString().padStart(2, "0");

  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

/**
 * 解析时间字符串 (格式: YYYY-MM-DD HH:mm:ss)
 * @param {string} timeStr - 时间字符串
 * @returns {Date} 日期对象
 */
export function parseTimeString(timeStr) {
  // 支持两种格式：YYYY-MM-DD HH:mm:ss 或 YYYY-MM-DD HH:mm
  const regex =
    /^(\d{4})-(\d{1,2})-(\d{1,2})[\sT](\d{1,2}):(\d{1,2})(?::(\d{1,2}))?$/;
  const match = timeStr.match(regex);

  if (!match) {
    throw new Error(
      "时间格式错误，请使用：YYYY-MM-DD HH:mm:ss 或 YYYY-MM-DD HH:mm"
    );
  }

  const [_, year, month, day, hour, minute, second = "0"] = match;

  // 验证时间组件范围
  if (parseInt(hour) < 0 || parseInt(hour) > 23) {
    throw new Error("小时必须在 0-23 之间");
  }
  if (parseInt(minute) < 0 || parseInt(minute) > 59) {
    throw new Error("分钟必须在 0-59 之间");
  }
  if (parseInt(second) < 0 || parseInt(second) > 59) {
    throw new Error("秒必须在 0-59 之间");
  }

  const date = new Date(
    parseInt(year),
    parseInt(month) - 1,
    parseInt(day),
    parseInt(hour),
    parseInt(minute),
    parseInt(second)
  );

  if (isNaN(date.getTime())) {
    throw new Error("无效的日期时间");
  }

  return date;
}

/**
 * 计算工作时间
 * @param {string} startStr - 开始时间字符串
 * @param {string} endStr - 结束时间字符串
 * @returns {Object} 包含小时、分钟和秒的对象
 */
export function calculateWorkTime(startStr, endStr) {
  const startTime = parseTimeString(startStr);
  const endTime = parseTimeString(endStr);

  if (endTime <= startTime) {
    throw new Error("结束时间必须晚于开始时间");
  }

  const timeDiff = endTime - startTime;
  const totalSeconds = Math.floor(timeDiff / 1000);
  const totalMinutes = Math.floor(totalSeconds / 60);

  return {
    hours: Math.floor(totalSeconds / 3600),
    minutes: Math.floor((totalSeconds % 3600) / 60),
    seconds: totalSeconds % 60,
    totalSeconds: totalSeconds,
    totalMinutes: totalMinutes,
  };
}

/**
 * 验证开始时间和结束时间的有效性
 * @param {string} startTime - 开始时间 (YYYY-MM-DD HH:mm)
 * @param {string} endTime - 结束时间 (YYYY-MM-DD HH:mm)
 * @returns {Object} 验证结果
 */
export function validateTimeRange(startTime, endTime) {
  // 基本参数检查
  if (!startTime || !endTime) {
    return {
      isValid: false,
      error: "开始时间和结束时间都不能为空",
    };
  }

  try {
    const start = parseTimeString(startTime);
    const end = parseTimeString(endTime);

    // 判断开始时间是否超过结束时间
    if (start > end) {
      return {
        isValid: false,
        error: "开始时间不能超过结束时间",
      };
    }

    // 判断结束时间是否低于开始时间（实际上与上面条件相同，但提供更明确的错误信息）
    if (end < start) {
      return {
        isValid: false,
        error: "结束时间不能低于开始时间",
      };
    }

    // 判断时间是否相等
    if (start.getTime() === end.getTime()) {
      return {
        isValid: false,
        error: "开始时间和结束时间不能相同",
      };
    }

    return {
      isValid: true,
      error: null,
      startDate: start,
      endDate: end,
      duration: end - start, // 毫秒数
    };
  } catch (error) {
    return {
      isValid: false,
      error: `时间格式错误: ${error.message}`,
    };
  }
}
